/************************************************
    Jsskep---This is a javascript skep.
    由于jsskep是多人合作的共同结果，所以中间
    难免有方法重复，另外有的方法也许有错误，
    时间有限，我们并未一个个去测试。如果你发现
    错误，请即时跟我们联系。
    Email: cssrain@gmail.com
    Blog:  http://www.cssrain.cn
*************************************************/



//初始化
if(typeof(dowell)=="undefined"){
    dowell={}
};

//命名空间
dowell.namespace=function(){
    var A=arguments,E=null,C,B,D;
    for(C=0;C<A.length;C=C+1){
        D=A[C].split(".");
        E=dowell;
        for(B=(D[0]=="dowell")?1:0;B<D.length;    B=B+1){
            E[D[B]]=E[D[B]]||{} ;
            E=E[D[B]]
        }
    }
    return E;
};


//dom操作空间
dowell.namespace("dom");
dowell.dom={
    //版本号
    version : "1.0",
    //根据ID获取DOM元素
    ById : function(id) {
        return document.getElementById(id);
    },
    //根据class获取DOM元素
    ByClassName :    function(oElm, strTagName, strClassName){
        var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
        var arrReturnElements = new Array();
        strClassName = strClassName.replace(/-/g, "\-");
        var oregExp = new RegExp("(^|\s)" + strClassName + "(\s|$)");    
        var oElement;    
        for(var i=0; i<arrElements.length; i++){    
        oElement = arrElements[i];    
        if(oRegExp.test(oElement.className)){    
        arrReturnElements.push(oElement);    
          }    
        }
        return (arrReturnElements)
    },
    //在目标元素后插入新元素。DOM没有提供insertAfter(),只提供了一个insertBefore()方法。
    insertAfter : function(newElement,targetElement) {
          var parent = targetElement.parentNode;
          if (parent.lastChild == targetElement) {// 如果最后的节点是目标元素，则直接添加。因为默认是最后
            parent.appendChild(newElement);
          } else {
            parent.insertBefore(newElement,targetElement.nextSibling);//如果不是，则插入在目标元素的下一个兄弟节点 的前面。也就是目标元素的后面。
          }
    },
    //获取当前元素的下一个元素节点
    getNextElement : function (node) {//获取当前元素的元素节点
          if(node.nextSibling.nodeType == 1) {
            return node.nextSibling;
          }
          if (node.nextSibling.nextSibling) {
            return this.getNextElement(node.nextSibling.nextSibling);//如果不是,继续查询下一个,直到if(node.nodeType == 1)
          }
          return null;
    },
    //追加样式
    addClass : function (element,value) { //追加样式，而不是替换样式
          if (!element.className) {
            element.className = value;
          } else {
            element.className+= " ";
            element.className+= value;
          }
     },
    //解决外嵌样式style , 用js获取不到的问题。
    //    var e1 = document.getElementById("exep1");
    //  alert(dowell.dom.getStyle(e1,"fontSize"));
    getStyle : function(elem, name){
            if(elem.style[name])
                return elem.style[name];
            else if(elem.currentStyle)    //ie
                return elem.currentStyle[name];
            else if(document.defaultView && document.defaultView.getComputedStyle){    //w3c
                name = name.replace(/([A-Z])/g,"-$1");
                name = name.toLowerCase();
                
                var s = document.defaultView.getComputedStyle(elem,"");
                return s && s.getPropertyValue(name);
            } else
                return null
    },
    //表格隔行变色. 引入 addClass()函数。
    stripeTables : function(classNames) {
      if (!document.getElementsByTagName) return false;
      var tables = document.getElementsByTagName("table");
      for (var i=0; i<tables.length; i++) {
        var odd = false;
        var rows = tables[i].getElementsByTagName("tr");
        for (var j=0; j<rows.length; j++) {
          if (odd == true) {
            this.addClass( rows[j], classNames );//classNames为样式名
            odd = false;
          } else {
            odd = true;
          }
        }
      }
    },
    //滑过变色. 引入 addClass()函数。
    highlightRows : function (tagName , classNames) {
      var _self = this;
      if(!document.getElementsByTagName) return false;
      var rows = document.getElementsByTagName(tagName);
      for (var i=0; i<rows.length; i++) {
        rows[i].oldClassName = rows[i].className
        rows[i].onmouseover = function() {
          _self.addClass(this, classNames );//classNames为样式名
        }
        rows[i].onmouseout = function() {
          this.className = this.oldClassName
        }
      }
    },
    //表格隔行变色 + 滑过变色
    //参数设置：id 为表格的id
    //class1为奇数行的颜色
    //class2为偶数行的颜色
    //class3为鼠标滑过颜色
    stripeTableById : function( id , class1 , class2 , class3  ){
          var para = document.getElementById(id);
          var tr  = para.getElementsByTagName("tr");
          var odd = false;
          for(var i=0 ; i < tr.length ; i++ ){
                if(odd==true){
                 tr[i].className = class1;      
                 odd=false;

                 tr[i].onmouseover =function(){
                    this.className = class3;
                 }
                 tr[i].onmouseout =function(){
                    this.className = class1;
                 }
                }
                else{
                 tr[i].className = class2;  
                 odd=true;

                  tr[i].onmouseover =function(){
                    this.className = class3;
                 }
                  tr[i].onmouseout =function(){
                    this.className = class2;
                 }
                }
          }
        }
}





//字符串操作空间
dowell.namespace("string");
dowell.string={
   //版本号
    version : "1.0",
   //将字符串前后空格,用空字符串替代
    trim : function(str){
          return str.replace(/(^\s*)|(\s*$)/g,"");
    },
    //去除字符串的左侧的空格
    ltrim : function(str){
          return str.replace(/(^\s*)/g, "");
    },
     //去除字符串的右侧的空格
    rtrim : function(str){
          return str.replace(/(\s*$)/g, "");
    },
   //替换字符串中的字符
    replaceAll : function(str,AFindText,ARepText){
         raRegExp = new RegExp(AFindText,"g");
         return str.replace(raRegExp,ARepText);
    },
    //把中文按2个字符处理，返回字符串长度
    cLen : function(str){  
         return str.replace(/[\u00FF-\uFFFF]/g,"  ").length;
    },
    //把中文按2个字符处理，返回字符串从startid到endid的内容
    cSubString :  function(str,start,end){
        var returnStr=''
        var currentNum=0;  //当前处理到的字符在字符串中的位置
        for(var i=0;i<str.length;i++){
            if(start<=currentNum && currentNum<end){
                returnStr+=str.charAt(i);
            };
            currentNum+=(str.charCodeAt(i)<=128?1:2);
        };
        return returnStr;
    },
    //按照指定字节长度截取字符串，超出部分用…（或者其他字符）代替
    showLeft : function(str,len){
        var endString  = arguments[2] || "…";
        var returnString= this.cSubString(str,0,parseInt(len));
        if (this.cLen(returnString)<this.cLen(str)){
            returnString+=endString;
        }
        return returnString;
    },
    //把字符串进行HTML编码
    HtmlEncode : function(str){
      return str.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/\"/g,""").replace(/\'/g,"'");
    },
    //把字符串进行HTML反编码
    unHtmlEncode : function(str){
     return str.replace(/\&\;/g, '\&').replace(/\>\;/g, '\>').replace(/\<\;/g, '\<').replace(/\"\;/g, '\'').replace(/\&\#39\;/g, '\'');
    },
    //去除字符串中的所有非数字,(得到数字).
    getNumber : function(str){
        return str.replace(/[\D]/g,'');
    }
}




//数组操作空间
dowell.namespace("array");
dowell.array={
   //版本号
    version : "1.0",
    //去掉数组中重复的元素
    strip : function(arrays){
        if(arrays.length<2) return [arrays[0]]||[];
        var arr=[];
        for(var i=0;i<arrays.length;i++){
            arr.push(arrays.splice(i--,1));
            for(var j=0;j<arrays.length;j++){
                if(arrays[j]==arr[arr.length-1]){
                    arrays.splice(j--,1);}}}
        return arr;
    },
    //得到l-h下标的数组
    limit :  function(arrays, l, h) {
        var _a = arrays ;
        var ret = [];
        l = l<0?0:l; h = h>_a.length?_a.length:h;
        for (var i=0; i<_a.length; i++) {
        if (i>=l && i<=h) ret[ret.length] = _a[i];
        if (i>h) break;
        };
        return ret;
    },
    //指定array是否包含指定的item
    //dowell.array.exists( arrays,item ) 包含true;不包含false;
    exists : function(arrays,item){
        for( var i = 0 ; i < arrays.length ; i++ )
        {
            if( item == arrays[i] )
            {
                return true;
            }
        }
        return false;
    },
    //删除指定的item
    remove : function(arrays, item ){
            for( var i = 0 ; i < arrays.length ; i++ ){
                if( item == arrays[i] )
                {
                    break;
                }
            }
            if( i == arrays.length ){
                return;
            }
            for( var j = i ; j < arrays.length - 1 ; j++ ){
                arrays[ j ] = arrays[ j + 1 ];
            }
            arrays.length--;
    },
    //得到数组里重复的元素
    uniq :   function(arrays){
                var o = {};    
                var s = {};
                for (var i=0,j=0,k=0; i<arrays.length; i++){
                    if (typeof o[arrays[i]] == 'undefined'){    
                        o[arrays[i]] = j++;
                    }else{
                        if(typeof s[arrays[i]]=='undefined'){
                            s[arrays[i]]=k++;
                        }
                    }
                }
                arrays.length = 0;
                for (var key in o){
                    arrays[o[key]] = key;
                }
                var r = [];
                for(var key in s){
                    r[s[key]] = key;
                }
                return r;
    },
    //交换指定两个元素的位置
    swap : function(arrays , i, j){
            var temp = arrays[i];
            arrays[i] = arrays[j];
            arrays[j] = temp;
            return arrays;
    },
    //选择排序，从小到大
    selectionSort : function (arrays){
            for (var i = 0; i < arrays.length; ++i){
                var index = i;
                for (var j = i + 1; j < arrays.length; ++j){    
                    if (arrays[j] < arrays[index]) {
                        index = j;
                    }
                }
                var temp = arrays[i];
                arrays[i] = arrays[index];
                arrays[index] = temp;
            }
            return arrays;
    },
    //查找指定元素，返回元素位置
    find : function(arrays,obj){
        for (var i=0;i<arrays.length;i++){
            if(arrays[i]===obj)    {
                return i
            }
        }
        return -1;//没找到 ，返回-1
    }
}

//数字操作空间
dowell.namespace("number");
dowell.number={
    //版本号
    version : "1.0",
    //获取0-N之间的随机整数
    randomInt : function(num1){
        return Math.floor(Math.random()*num1);
    },
    //转换成中文大写金额
    toMoney : function(num) {  
        var str1='零壹贰叁肆伍陆柒捌玖';
        var str2='万仟佰拾亿仟佰拾万仟佰拾元角分';
        var str5='',str3,tr4,i,j,ch1,ch2,nzero=0;
        num=Math.abs(num).toFixed(2);
        str4=(num*100).toFixed(0).toString();
        j=str4.length;
        if (j>15){
            return '溢出';
        }
        str2=str2.substr(15-j);
        for(i=0;i<j;i++){
            str3=str4.substr(i,1);
            if(i!=(j-3) && i!=(j-7) && i!=(j-11) && i!=(j-15)){
                if (str3=='0'){
                    ch1='';
                    ch2='';
                    nzero=nzero + 1;
                }else{
                    if(str3!='0' && nzero!=0){
                        ch1='零' + str1.substr(str3*1,1);
                        ch2=str2.substr(i,1);
                        nzero=0;
                    }else{
                        ch1=str1.substr(str3*1,1);
                        ch2=str2.substr(i,1);
                        nzero=0;
                    }
                }
            }else{
                if (str3!='0' && nzero!=0){
                    ch1="零" + str1.substr(str3*1,1);
                    ch2=str2.substr(i,1);
                    nzero=0;
                }else{
                    if (str3!='0' && nzero==0){
                        ch1=str1.substr(str3*1,1);
                        ch2=str2.substr(i,1);
                        nzero=0;
                    }else{
                        if (str3=='0' && nzero >= 3){
                            ch1='';
                            ch2='';
                            nzero=nzero + 1;
                        }else{
                            if (j >= 11){
                                ch1='';
                                nzero=nzero + 1;
                            }else{
                                ch1='';
                                ch2=str2.substr(i,1);
                                nzero=nzero + 1;
                            }
                        }
                    }
                }
            }
            if (i==(j-11) || i==(j-3)){
                ch2=str2.substr(i,1);
            }
            str5=str5 + ch1 + ch2;
            if (i==j-1 && str3=='0' ){
                str5=str5 + '整';
            }
        }
        if (num==0){
            str5='零元整';
        }
        return str5;
    },
    //保留小数点位数
    toFixed : function(num , len){
        if(isNaN(len)||len==null){
            len = 0;
        } else{
            if(len<0){
                len = 0;
            }
        }
        return Math.round(num * Math.pow(10,len)) / Math.pow(10,len);
    }    
}

//函数操作空间
dowell.namespace("func");
dowell.func={
    //版本号
    version : "1.0",
    // 加载多个函数.
    // addLoadEvent(func_a);
    // addLoadEvent(func_b);
    addLoadEvent :     function addLoadEvent(func) {
              var oldonload = window.onload;
              if (typeof window.onload != 'function') {
                window.onload = func;
              } else {  
                window.onload = function() {
                  oldonload();
                  func();
                }
              }
        },
    // func函数在t毫秒延时后执行
    runAfter : function(func , t){
        var B = Array.prototype.slice.call(arguments,1);
        var f = function(){
            func.apply(null, B);
        };
        return setTimeout(f , t);
    },
    // 函数每隔t毫秒执行一次
    runEach : function(func , t){
        var B = Array.prototype.slice.call(arguments,1);
        var f = function(){
            func.apply(null,B);
        };
        return setInterval(f, t);
    },
    //函数每隔t毫秒执行，总执行n次
    runNum : function(func , t , n){
        var A = func;
        var B = Array.prototype.slice.call(arguments,2);
        var f = function(){
            A.apply(null, B);
        };
        if(t==0){
            f();return;
        };
        if(n<1){
            return;
        };
        for (i=1;i<=n;i++){
            setTimeout(f,t*i);
        };
    }
}


//对象操作空间
dowell.namespace("obj");
dowell.obj={
    //版本号
    version : "1.0",
    //把一个 OBJECT合并到当前object同名的元素覆盖,不同的就增加
    //var aa = {"r":"111"};
    //var cc = {"d":"222"};
    //var dd = extend(aa,cc);
    //for(var item in dd){
    //   alert(  dd[item]  )
    //}
    extend : function(obj,prop) {  
        // 防止传入错误的参数prop；  
        if( prop === null || prop == undefined)  
            return obj;  
        // 如果prop为空，则将obj扩展到自己身上，jQuery.js中大部分都是为空；  
        if( !prop ) {  
            return obj;
        }  
        // 将prop的所有属性复制到obj；  
        for (var i in prop )  
        obj[ i ] = prop[ i ];  
        return obj;  
    }  
}


//日期操作空间
dowell.namespace("date");
dowell.date={
   //版本号
    version : "1.0"
}



//验证操作空间
dowell.namespace("validate");
dowell.validate={
   //版本号
    version : "1.0",
    //返回字符串是否电子邮件
    isEmail :  function(str){
        return (/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/).test(str);
    },
    //返回字符串是否合法URL地址
    isUrl : function(str){
        return (/^(http|https|ftp):\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/).test(str);
    },
    //返回字符串是否http地址
    isHttp : function(str){
        return (/^(http|https|ftp):\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/).test(str);
    },
    //返回字符串是否整数,包含正整数和负整数
    isIntegral : function(str){
        return (/^(-|\+)?(\d)*$/).test(str);
    },
    //返回字符串是否浮点数
    isFloat : function(str){
        return (/^(-)?(\d)*(\.)?(\d)*$/).test(str);
    },
    //返回字符串是否汉字
    isChinese : function(str){
        return (/^[u4e00-u9fa5],{0,}$/).test(str);
    },
    //返回字符串是否普通电话、传真号码
    isTelephone : function(str){
        return (/^((d{3,4})|d{3,4}-)?d{7,8}$/).test(str);
    },
    //返回字符串是否手机号
    isMobile : function(str){
        return (/^1(3|5)\d{9}$/).test(str);
    },
    //返回字符串是否匹配腾讯QQ号
    isQQ : function(str){
        return (/^[1-9][0-9]{4,10}$/).test(str);
    },
    //返回字符串是否匹配中国邮政编码
    isPostCode : function(str){
        return (/^(\d){6}$/).test(str);
    },
    //返回字符串是否匹配身份证
    isIdenCardID : function(str){
        return (/^(\d{15}|\d{17}[x0-9])$/).test(str);
    },
    //返回字符串是否匹配时间格式
    isTime : function(str){
        return (/^(\d+):(\d{1,2}):(\d{1,2})$/).test(str);
    },
    //返回字符串是否匹配日期验证
    isDatetime : function(str){
            if(Date.parse(str)||Date.parseDate(str)){
            return true;
        }else{
            return false;
        }
    },
    //返回字符串是否合法文件名
    isFileName : function(str){
        return (/[\\\/\*\?\|:"<>]/).test(str);
    },
    // 判断是否是ip
    isIp : function(str){
        return (/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])(\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$/).test(str);
    },

    //判断输入是否是一个整数
     isValidPositiveInteger : function(str){
        var result=str.match(/^(-|\+)?\d+$/);
        if(result==null) return false;
        return true;
    },
    //判断输入是否是一个正整数
     isValidPositiveInteger : function(str){
        var result=str.match(/^\d+$/);
        if(result==null) return false;
        if(parseInt(str)>0) return true;
        return false;
    },
    //判断输入是否是一个负整数
     isValidNegativeInteger : function(str){
        var result=str.match(/^-\d+$/);
        if(result==null) return false;
        return true;
    },
     //判断输入是否是一个数字
     isValidNumber : function(str){
        return !isNaN(str);
    },
    //判断输入是否是一个由 A-Z / a-z 组成的字符串
     isValidLetters : function(str){
        var result=str.match(/^[a-zA-Z]+$/);
        if(result==null) return false;
        return true;
     },
     //判断输入是否是一个由 0-9 / A-Z / a-z 组成的字符串
     isValidAlphanumeric : function(str){
        var result = str.match(/^[a-zA-Z0-9]+$/);
        if(result==null) return false;
        return true;
     },
     //判断输入是否是一个由 0-9 组成的数字
    isValidDigits : function(str){
        var result = str.match(/^[1-9][0-9]+$/);
        if(result==null) return false;
        return true;
    },
    //判断输入是否是一个由 0-9 / A-Z / a-z / . / _ 组成的字符串
    isValidString : function(str){
        var result=str.match(/^[a-zA-Z0-9\s.\-_]+$/);
        if(result==null) return false;
        return true;
    },
    //判断输入是否是有效的短日期格式 - "YYYY-MM-DD"
    isValidDate : function(str){
        var result=str.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/);
        if(result==null) return false;
        var d=new Date(result[1], result[3]-1, result[4]);
        return (d.getFullYear()==result[1]&&d.getMonth()+1==result[3]&&d.getDate()==result[4]);
    },
    //判断输入是否是有效的时间格式 - "HH:MM:SS"
    isValidTime : function(str){
        var resule=str.match(/^(\d{1,2})(:)?(\d{1,2})\2(\d{1,2})$/);
        if (result==null) return false;
        if (result[1]>24 || result[3]>60 || result[4]>60) return false;
        return true;
    },
    //判断输入是否是有效的长日期格式 - "YYYY-MM-DD HH:MM:SS"
    isValidDatetime : function(str){
        var result=str.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/);
        if(result==null) return false;
        var d= new Date(result[1], result[3]-1, result[4], result[5], result[6], result[7]);
        return (d.getFullYear()==result[1]&&(d.getMonth()+1)==result[3]&&d.getDate()==result[4]&&d.getHours()==result[5]&&d.getMinutes()==result[6]&&d.getSeconds()==result[7]);
    }
}





//Ajax操作空间
dowell.namespace("ajax");
dowell.ajax={
   //版本号
    version : "1.0",
    getJsonLength : function(jsonData){
        var jsonLength = 0;
        for(var item in jsonData) {
                jsonLength++;
        }
        return jsonLength;
    }
}


//用户界面操作空间
dowell.namespace("ui");
dowell.ui={
   //版本号
    version : "1.0"
}



//帮助操作空间
dowell.namespace("help");
dowell.help={
   //版本号
    version : "1.0" ,
    author : "cssrain",
    blog : "http://www.cssrain.cn",
    email : "cssrain@gmail.com",
    about : "..."
}